import * as tfvis from '@tensorflow/tfjs-vis'
import * as tf from '@tensorflow/tfjs'

/**
 * 线性回归
 * */
window.onload = () => {
	const xs = [1, 2, 3, 4]
	const ys = [1, 2, 3, 4]
	console.log(xs.map((x, i) => ({x, y: ys[i]})))

	// 散点图
	tfvis.render.scatterplot(
	{
		name: "线性回归训练集"
	}, {
		values: xs.map((x, i) => ({x, y: ys[i]}))
	}, {
		xAxisDomain: [0, 5],
		yAxisDomain: [0, 8]
	})

	const inputs = tf.tensor1d(xs);
	const labels = tf.tensor1d(ys);

	// w:权重 b:偏置
	const w = tf.variable(tf.scalar(Math.random()));
	const b = tf.variable(tf.scalar(Math.random()));
	inputs.print()
	console.log("-------------")
	w.print()
	b.print()

	// 函数：Y = wX + b
	const f = x => w.mul(x).add(b);

	const r = f(inputs)
	r.print()
	console.log("-------------")

	const numIterations = 200;
	const learningRate = 0.1;
	const optimizer = tf.train.sgd(learningRate);

	// 损失函数：均方误差
	const loss = (pred, label) => pred.sub(label).square().mean();

	for (let iter = 0; iter < numIterations; iter++) {
		// 梯度下降
		optimizer.minimize(() => {
			const loss_var = loss(f(inputs), labels);
			console.log("-------------loss")
			loss_var.print();
			console.log("-------------w")
			w.print();
			console.log("-------------b")
			b.print();
			return loss_var;
		})
	}


	// /**
	//  * 连续的模型
	//  */
	// const model = tf.sequential()
	//
	// /** 全链接层
	//  * units 神经元数
	//  * inputShape 输入形状
	//  */
	// model.add(tf.layers.dense({
	// 	units: 1, inputShape: [1]
	// }))
	//
	// /**
	//  * 设置损失函数、优化器sgd(学习率)
	//  */
	// model.compile({
	// 	loss: tf.losses.meanSquaredError,
	// 	optimizer: tf.train.sgd(0.1),
	// })
	//
	//
	// const inputs = tf.tensor(xs)
	// const labels = tf.tensor(ys)
	//
	// /**fit 开始学习任务
	//  * batchSize 取样数
	//  * epochs 对训练数据数组进行迭代的次数。
	//  */
	// model.fit(inputs, labels, {
	// 	batchSize: 1,
	// 	epochs: 1,
	// 	callbacks: tfvis.show.fitCallbacks({
	// 		name: "训练过程"
	// 	}, [
	// 		'loss'
	// 	])
	// })
	//
	//
	// window.predict = (form) => {
	// 	const output = model.predict(tf.tensor([form.x.value * 1]));
	// 	alert(`如果 x 为 ${form.x.value}，那么预测 y 为 ${output.dataSync()[0]}`);
	// }

}

